home *** CD-ROM | disk | FTP | other *** search
- ; RSB.ASM
- ; RSB - ASM fn to call C RSB (Read Screen Block) fn
-
-
- include $rap.mac
-
- DOSSEG ; std segment conventions
- .MODEL SMALL ; Small memory model
-
-
- .CODE ; code segment
- EXTRN _rsb:NEAR
-
- SROW DW 0
- SCOL DW 0
- NROWS DW 0
- NCOLS DW 0
- NELEM DW 0
- NPARS DW 0
- NBYTES DW 0
- APLCS DW 0
-
- PUBLIC _main
- _main PROC
- int 3
- push bp
- mov bp,sp
-
- push ds
- push es
- push di
- push si
-
- ; get right arg (location,size info) ... load to vars
- mov ax,cs ; prepare to get var ptr
- sub ax,10h ; adjust for offset
- mov es,ax ; and load to ES
- mov cs:APLCS,es ; save for posterity
- mov ds,word ptr es:[80h] ; get arg ptr to DS
- mov ax,word ptr ds:[10] ; SROW (first locn nbr)
- mov cs:SROW,ax
- mov ax,word ptr ds:[12] ; SCOL
- mov cs:SCOL,ax
- mov ax,word ptr ds:[14] ; NROWS
- mov cs:NROWS,ax
- mov ax,word ptr ds:[16] ; get NCOLS (last locn nbr)
- mov cs:NCOLS,ax
-
- ; remove input item now
- mov ah,$RELM
- int SVP
-
- ; calculate result size for APL and space request
- mov ax,cs:NROWS ; load NROWS to AX
- mov cx,cs:NCOLS
- mul cl ; mul by NCOLS, res in AX
- mov cs:NELEM,ax ; save ...
- mov cl,4
- shr ax,cl ; div AX by 16 (#pars)
- inc ax ; round up by one
- mov cs:NPARS,ax ; save ...
- shl ax,cl ; get #bytes rounded up to
- mov cs:NBYTES,ax ; mult of 16
-
- ; request space from WS
- push ds
- mov dx,NPARS ; load up nbr pars
- mov ah,$GETM ; mem request
- int SVP ; call int .. DS pts to space
-
- ; establish result header
- push ds ; get DS into ES
- pop es ; instead of MOVs
- pop ds ; get DS back
- mov ax,cs:NBYTES ; nbr bytes of result
- mov E$NB,ax ;
- mov ax,cs:NELEM ; nbr elements
- mov E$NELM,ax ;
- mov E$TYPE,3 ; type = char
- mov E$RANK,2 ; is 2 dim matrix
- mov ax,cs:NROWS ; NROWS
- mov E$DIM1,ax ;
- mov ax,cs:NCOLS ; NCOLS
- mov E$DIM2,ax ;
-
- ; finally, tell C what it needs to know
- push cs:NCOLS
- push cs:NROWS
- push cs:SCOL
- push cs:SROW
- push es ; need to tell C result seg
- mov ax,12 ; and offset of bufr
- push ax
-
- ; call C
- call _rsb
- add sp,12
-
- ; final housekeeping ...
- mov ax,es ; Point result at new object
- mov ds,ax
- mov es,cs:APLCS ; and load to ES
- mov word ptr es:[80h],ds ; get res ptr to APL
- mov word ptr es:[82h],0
-
- pop si
- pop di
- pop es
- pop ds
-
- pop bp
-
- ret
- _main ENDP
- END